package com.niit.scala

/**
 * Date:2025/4/7
 * Author：Ys
 * Description:
 */
object Base10 {


  def main(args: Array[String]): Unit = {

    /*
    模式匹配：
        1.简单模式匹配
        2.匹配类型
        3.模式匹配的守卫
        4.匹配样例类
        5.匹配集合
        6.变量生命中的模式匹配
        7.匹配for循环表达式
     */
    //1.简单的模式匹配 switch(str) - case
    //需求：输入Hadoop或者Spark，分别显示两者的简介信息，如果输入其他则显示未匹配
    var str = "Hadoop"
    var res = str match {
      case "Hadoop" => "大数据分布式存储和计算框架"
      case "Spark" => "大数据分布式内存计算框架"
      case _ => "未匹配"
    }
    println(res)

    //2.匹配类型
    val i:Any = 999
    i match {
      case i:String => println("i 是字符串")
      case _:Int => println("i 是整数")
      //已知case后面的变量名是固定，所以可以使用_来占位
      case _:Double => println("i 是浮点数")
      case _=> println("i 是其他类型")
    }
    //3.模式匹配的守卫
    //输入一数，获得这个数所在的区间
    var num = 5
    num match {
      case num if num>=0 && num<=10 => println("区间为0-10")
      case num if num>=11 && num<=20 => println("区间为11-20")
      case num if num>=21 && num<=30 => println("区间为21-30")
      case _ => println("未匹配")
    }

    //4.匹配样例类
    //1.样例类的类型写在小括号，编写的字段格式要和该样例类的字段保持一致
    //2.通过match进行模式匹配的时候，要匹配到对应的样例类，并且要匹配到对应的字段
    var c:Any = Customer(1,"张三",18)
    var o:Any = Order(1)
    var arr:Any = Array(1,2)

    c match {
      case Customer(a,b,c) => println("匹配到Customer")
      case Order(a) => println("匹配到Order")
      case _ => println("未匹配")
    }


    //5.1匹配集合  数组
    var arr1 = Array(1,2,3)
    var arr2 = Array(0)
    var arr3 = Array(1,2,3,4,5)

    arr1 match {
      case Array(0) => println("匹配到数组的第一个元素为0")
      case Array(1, x, y) => println("长度为3，首元素为1")
      case Array(1, _*) => println("匹配到数组的第一个元素为1，后面无所谓")
      case _ => println("未匹配")
    }
     //5.2 匹配集合  List
     var list1 = List(0)
     var list2 = List(0,1,2,3,4,5)
     var list3 = List(1,2)

     list3 match {
       case List(0) => println("匹配到List的第一个元素为0,且只有一个元素")
       case List(0,_*) => println("匹配到List的第一个元素为0,后面无所谓")
       case List(x,y) => println("匹配到List只有两个元素")
       case _=>println("未匹配")
     }
      //list 关键字符的表达式
      list3 match {
        case 0::Nil => println("匹配到list的第一个元素为0，且只有一个元素")
        case 0::tail => println("匹配到list的第一个元素为0，后面无所谓")
        case x::y::Nil=> println("匹配到list只有两个元素")
        case _=>println("未匹配")
      }

      //6.变量声明中的模式匹配
    //生成1-10的数组，去获得第二 三、 四的元素
      var arr4 =(1 to 10).toArray
      val Array(_,x,y,z,_*) = arr4
      println(x,y,z)

    //生成一个1-10的列表，去获得第一 二 元素
    var list4 = (1 to 10).toList
    //方式一
    var List(a,b,_*) = list4
    println(a,b)
    //方式二
    val n::m::tail = list4
    println(n,m)

    //7.匹配for循环表达式
    //定义变量记录学生的姓名和年龄，获得年龄为23的学生信息
    var map1 = Map( "张三"->23,"李四"->24,"王五"->25 )

    //传统的for 的 守卫
    for ( ( k,v) <- map1 if v==23){
      println(k,v)
    }

    //固定值的方式
    for( (k,23) <- map1 ){
      println(k,23)
    }

    //options类型，在实际开发中，难免会出现空指针，在Scala中，提供了Option类型，可以解决空指针问题
    // Option类型：
    // 1.Some  表示有值
    // 2.None  表示没有值
    var p = 10
    var u = 2
    var r = div(p,u)
    println(r)
  }

  def div(a:Int,b:Int) = {
    if(b == 0){
      None
    }else{
      Some(a/b)
    }
  }



  case class Customer(id:Int,name:String,age:Int)
  case class Order(id:Int)

}
